/**
 ******************************************************************************
 * @file    alarm_network.h
 * @author  x-itg
 * @brief   无线传感器报警网络系统 - 头文件
 ******************************************************************************
 */
#ifndef __ALARM_NETWORK_H__
#define __ALARM_NETWORK_H__

#include <stdint.h>
#include "stm32_timer.h"

/* 系统配置参数 */
#define MAX_EVENTS              10      // 最大事件数
#define EVENT_TIMEOUT_MS        5000    // 事件超时时间(ms)
#define RETRANSMIT_TIMEOUT_MS   1000    // 重传超时时间(ms)
#define MAX_RETRANSMIT_COUNT    2       // 最大重传次数
#define ALARM_DURATION_MS       5000    // 报警持续时间(ms)


/* 节点ID范围 */
#define COLLECTOR_MIN_ID        1
#define COLLECTOR_MAX_ID        100
#define ALARM_MIN_ID            101
#define ALARM_MAX_ID            110

/* 系统状态定义 */
typedef enum {
    STATE_IDLE = 0,         // 空闲状态
    STATE_SENDING,          // 发送状态
    STATE_WAITING_ACK,      // 等待应答
    STATE_ALARM_ACTIVE      // 报警激活状态
} NodeState_t;

/* 数据包结构 */
typedef struct {
    uint8_t preamble;       // 前导码 0xAA
    uint8_t node_type;      // 节点类型
    uint8_t node_id;        // 节点ID
    uint8_t event_id;       // 事件ID
    uint8_t data;           // 数据 (1:报警, 0:正常)
    uint8_t checksum;       // 校验和
} Packet_t;

/* 事件结构 */
typedef struct {
    uint8_t node_id;        // 节点ID
    uint8_t event_id;       // 事件ID
    uint32_t timestamp;     // 时间戳
    uint8_t confirmed;      // 是否已确认
    uint8_t ack_received_count; // 已收到应答的报警端数量
    uint16_t ack_bitmap;    // 每位对应一个报警端(101-110)，位1表示已收到该报警端的应答
    UTIL_TIMER_Object_t ackTimer; // per-event ACK 定时器（报警端按时隙应答）
    uint8_t ack_sent;       // 报警端是否已对该事件发送过 ACK（防止重复应答）
} Event_t;

/* 全局变量声明 */
extern NodeState_t State;
extern Packet_t TxPacket;
extern Event_t events[MAX_EVENTS];
extern uint8_t currentEventId;
extern uint8_t retransmitCount;
extern uint32_t lastEventTime;
extern uint8_t lastEventNodeId;

// 函数指针，用于重新启动状态报告定时器
extern void (*RestartStatusReportTimer)(void);

/* 函数声明 */
uint8_t CalculateChecksum(Packet_t *packet);
uint8_t ValidatePacket(Packet_t *packet);
uint8_t FindEvent(uint8_t node_id, uint32_t current_time);
uint8_t CreateNewEvent(uint8_t node_id, uint32_t current_time);
void ProcessAlarmPacket(Packet_t *packet);
void ProcessAckPacket(Packet_t *packet);
void SendAlarmPacket(uint8_t event_id);
void SendAckPacket(uint8_t event_id);
void HandleRetransmission(void);
void HandleAlarmTimeout(void);
void ProcessSensorData(uint8_t sensor_id, uint8_t sensor_value);
void AlarmNetwork_Init(void);

/* 传感器接口函数声明 */
uint8_t GetSensorAlarmStatus(uint8_t sensor_id);
void ClearSensorAlarm(uint8_t sensor_id);





 
#endif /* __ALARM_NETWORK_H__ */